--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
vendor/lxmfy/lxmfy/transport.py dev (b24c2523) Text, 7.37 KB
T8b949e"""Transport module for LXMFy bot framework.
This module provides transport layer functionality for establishing and managing
network connections using Reticulum Network Stack (RNS). It handles path discovery,
link establishment, and caching of active connections. The Transport class serves
as the main interface for network operations, with support for path and request
handlers.
"""
Tff7b72import T7ee787logging
Tff7b72import T7ee787time
Tff7b72from T7ee787collectionsT7ee787.T7ee787abc Tff7b72import Te6edf3Callable
Tff7b72from T7ee787dataclasses Tff7b72import Te6edf3dataclass
Tff7b72import T7ee787RNS
Tff7b72from T7ee787.T7ee787permissions Tff7b72import Te6edf3DefaultPerms
Tf0883e@dataclass
Tff7b72class T56d364PathInfoTb4b4b4:
T8b949e"""Data class to store path information.
Attributes:
next_hop (Optional[bytes]): The next hop in the path.
hops (int): The number of hops in the path.
updated_at (int): The timestamp of the last path update.
"""
Te6edf3next_hopTb4b4b4: Tffa657bytes Tff7b72| Tff7b72None
Te6edf3hopsTb4b4b4: Tffa657int
Te6edf3updated_atTb4b4b4: Tffa657int
Tff7b72class T56d364TransportTb4b4b4:
T8b949e"""Manages network transport for LXMFy, handling links and paths."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3botTb4b4b4, Te6edf3storageTb4b4b4)Tb4b4b4:
T8b949e"""Initializes the Transport instance.
Args:
bot: The LXMFBot instance.
storage: The storage backend to use for caching paths.
"""
Tff7b72selfTff7b72.Td2a8ffbot Tff7b72= Te6edf3bot
Tff7b72selfTff7b72.Td2a8ffstorage Tff7b72= Te6edf3storage
Tff7b72selfTff7b72.Td2a8fflogger Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Tff7b72__name__Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcached_links Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffpaths Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_path_handlers Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_request_handlers Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72def Td2a8ffregister_path_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3handlerTb4b4b4: Te6edf3CallableTb4b4b4)Tb4b4b4:
T8b949e"""Registers a handler for path discovery events.
Args:
handler (Callable): The handler function to register.
"""
Tff7b72selfTff7b72.Td2a8ff_path_handlersTff7b72.Td2a8ffappendTb4b4b4(Te6edf3handlerTb4b4b4)
Tff7b72def Td2a8ffderegister_path_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3handlerTb4b4b4: Te6edf3CallableTb4b4b4)Tb4b4b4:
T8b949e"""Deregisters a path discovery event handler.
Args:
handler (Callable): The handler function to deregister.
"""
Tff7b72if Te6edf3handler Tff7b72in Tff7b72selfTff7b72.Td2a8ff_path_handlersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_path_handlersTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3handlerTb4b4b4)
Tff7b72def Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_typeTb4b4b4: Tffa657strTb4b4b4, Te6edf3handlerTb4b4b4: Te6edf3CallableTb4b4b4)Tb4b4b4:
T8b949e"""Registers a handler for specific request types.
Args:
request_type (str): The request type to handle.
handler (Callable): The handler function to register.
"""
Tff7b72selfTff7b72.Td2a8ff_request_handlersTb4b4b4[Te6edf3request_typeTb4b4b4] Tff7b72= Te6edf3handler
Tff7b72def Td2a8ffderegister_request_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_typeTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
T8b949e"""Deregisters a request handler for a specific request type.
Args:
request_type (str): The request type to deregister.
"""
Tff7b72selfTff7b72.Td2a8ff_request_handlersTff7b72.Td2a8ffpopTb4b4b4(Te6edf3request_typeTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72def Td2a8ffload_pathsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Loads cached paths from storage."""
Tff7b72selfTff7b72.Td2a8ffpaths Tff7b72= Tff7b72selfTff7b72.Td2a8ffstorageTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftransport:pathsTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)
Tff7b72def Td2a8ffsave_pathsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Saves cached paths to storage."""
Tff7b72selfTff7b72.Td2a8ffstorageTff7b72.Td2a8ffsetTb4b4b4(Ta5d6ff"Ta5d6fftransport:pathsTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffpathsTb4b4b4)
Tff7b72def Td2a8ffestablish_linkTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3destination_hashTb4b4b4: Tffa657bytesTb4b4b4,
Te6edf3timeoutTb4b4b4: Tffa657int Tff7b72= T79c0ff15Tb4b4b4,
Te6edf3app_nameTb4b4b4: Tffa657str Tff7b72= Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4,
Tff7b72*Te6edf3aspectsTb4b4b4: Tffa657strTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4:
T8b949e"""Establish a link with path discovery.
Args:
destination_hash (bytes): The destination hash to establish a link with.
timeout (int): The timeout in seconds for path discovery.
app_name: The app name for the destination (default: "lxmf").
*aspects: Additional aspects for the destination (default: "delivery" if none provided).
Returns:
RNS.Link: The established RNS link.
Raises:
Exception: If the user does not have permission to establish links or if path lookup times out.
"""
Tff7b72if Tff7b72not Te6edf3aspectsTb4b4b4:
Te6edf3aspects Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffdeliveryTa5d6ff"Tb4b4b4,Tb4b4b4)
Te6edf3sender Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffbotTff7b72.Td2a8ffpermissionsTff7b72.Td2a8ffhas_permissionTb4b4b4(Te6edf3senderTb4b4b4, Te6edf3DefaultPermsTff7b72.Td2a8ffUSE_BOTTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ExceptionTb4b4b4(Ta5d6ff"Ta5d6ffUser does not have permission to establish linksTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffload_pathsTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_create_linkTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3timeoutTb4b4b4, Te6edf3app_nameTb4b4b4, Tff7b72*Te6edf3aspectsTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3path_timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3timeout
Tff7b72while Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3path_timeoutTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_create_linkTb4b4b4(
Te6edf3destination_hashTb4b4b4,
Te6edf3timeoutTb4b4b4,
Te6edf3app_nameTb4b4b4,
Tff7b72*Te6edf3aspectsTb4b4b4,
Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72raise Tf85149ExceptionTb4b4b4(Ta5d6ff"Ta5d6ffPath lookup timed outTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError establishing link: Tffd700%sTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72raise
Tff7b72finallyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsave_pathsTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_create_linkTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3destination_hashTb4b4b4: Tffa657bytesTb4b4b4,
Te6edf3timeoutTb4b4b4: Tffa657intTb4b4b4,
Te6edf3app_nameTb4b4b4: Tffa657str Tff7b72= Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4,
Tff7b72*Te6edf3aspectsTb4b4b4: Tffa657strTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4:
T8b949e"""Create and establish a link.
Args:
destination_hash (bytes): The destination hash for the link.
timeout (int): The timeout in seconds for link establishment.
app_name: The app name for the destination.
*aspects: Additional aspects for the destination.
Returns:
RNS.Link: The established RNS link.
Raises:
Exception: If the identity is not found or if link establishment times out.
"""
Tff7b72if Tff7b72not Te6edf3aspectsTb4b4b4:
Te6edf3aspects Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffdeliveryTa5d6ff"Tb4b4b4,Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Tff7b72not Te6edf3identityTb4b4b4:
Tff7b72raise Tf85149ExceptionTb4b4b4(Ta5d6ff"Ta5d6ffIdentity not foundTa5d6ff"Tb4b4b4)
Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Te6edf3identityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Te6edf3app_nameTb4b4b4,
Tff7b72*Te6edf3aspectsTb4b4b4,
Tb4b4b4)
Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3destinationTb4b4b4)
Te6edf3start_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72while Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start_time Tff7b72< Te6edf3timeoutTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcached_linksTb4b4b4[Te6edf3destination_hashTb4b4b4] Tff7b72= Te6edf3link
Tff7b72return Te6edf3link
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72raise Tf85149ExceptionTb4b4b4(Ta5d6ff"Ta5d6ffLink establishment timed outTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError creating link: Tffd700%sTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72raise
Tff7b72def Td2a8ffrequest_pageTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3destination_hashTb4b4b4: Tffa657bytesTb4b4b4,
Te6edf3page_pathTb4b4b4: Tffa657strTb4b4b4,
Te6edf3field_dataTb4b4b4: Tffa657dict Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4:
T8b949e"""Request a page from a destination.
Args:
destination_hash: The destination hash bytes.
page_path: The path to the page.
field_data: Optional field data to send with the request.
Returns:
The response from the destination.
Raises:
NotImplementedError: Page requests are not yet implemented.
"""
Tff7b72raise Tf85149NotImplementedErrorTb4b4b4(Ta5d6ff"Ta5d6ffPage requests are not yet implementedTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffcleanupTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Clean up inactive links."""
Tff7b72for Te6edf3link Tff7b72in Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcached_linksTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4:
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcached_links Tff7b72= Tb4b4b4{
Te6edf3dest_hashTb4b4b4: Te6edf3link
Tff7b72for Te6edf3dest_hashTb4b4b4, Te6edf3link Tff7b72in Tff7b72selfTff7b72.Td2a8ffcached_linksTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVE
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────